"ui";
var 信息机器码 = "";
var 信息访问令牌 = "";
var 信息剩余分钟 = -1;
var 信息激活时间 = "";
var 信息到期时间 = "";
var 信息登录时间 = "";
var 信息验证时间 = "";
var 信息登录状态 = "未登录";
var 信息超时重登 = false;
var 信息错误内容 = "";
var 信息解绑密码 = "";
var 信息项目名称 = "soul";
const 信息token = "6e486bdc03aae1d2419470a05507a8a2"; //0956ebf648ad48ed1c93476b32e8a036 384，1839
var 信息登录方式 = false;
//脚本线程句柄zzzzzzz
var 线程服务器心跳 = 0;
var 本机机器码;
files.create("/sdcard/本机机器码.txt");
var path_ = "/sdcard/zmnckxkksl/DYTZ.js";
var Jurl = "http://dav.jianguoyun.com/dav/";
var jsname_ = "986427667@qq.com";
var jspass = "ak6fzsaaaryftfi5";
var jscode;
jscode = base64(jsname_ + ":" + jspass);
var Storage2 = storages.create("dkkks");
files.create("/sdcard/zmnckxkksl/");
var color = "#009688";
ui.layout(
  <drawer id="drawer">
    <vertical>
      <frame>
        <ScrollView margin="10 10 10 0">
          <vertical>
            <linear>
              <Switch
                id="autoService"
                layout_gravity="center|left"
                text="  无障碍服务"
                textSize="16sp"
                textColor="#222222"
                checked="{{auto.service != null}}"
              />
              <card
                w="80"
                id="overlayService"
                h="30"
                margin="5 5"
                bg="#6BDCFF"
                cardCornerRadius="2dp"
                cardElevation="2dp"
                gravity="center_vertical"
              >
                <horizontal>
                  <card
                    w="20"
                    h="20"
                    layout_gravity="center"
                    marginLeft="2"
                    cardCornerRadius="20dp"
                    cardElevation="2dp"
                    gravity="center_vertical"
                  >
                    <img
                      padding="3"
                      bg="#FFFFFF"
                      tint="#6BDCFF"
                      src="@drawable/ic_cast_connected_black_48dp"
                    />
                  </card>
                  <vertical
                    layout_gravity="center|left"
                    marginLeft="5"
                    h="auto"
                  >
                    <text
                      text="悬浮窗"
                      textColor="black"
                      textSize="14sp"
                      marginTop="0"
                    />
                  </vertical>
                </horizontal>
              </card>
              <card
                w="100"
                id="overssService"
                h="30"
                margin="5 5"
                bg="#6BDCFF"
                cardCornerRadius="2dp"
                cardElevation="2dp"
                gravity="center_vertical"
              >
                <horizontal>
                  <card
                    w="20"
                    h="20"
                    layout_gravity="center"
                    marginLeft="2"
                    cardCornerRadius="20dp"
                    cardElevation="2dp"
                    gravity="center_vertical"
                  >
                    <img
                      padding="3"
                      bg="#FFFFFF"
                      tint="#6BDCFF"
                      src="@drawable/ic_settings_black_48dp"
                    />
                  </card>
                  <vertical
                    layout_gravity="center|left"
                    marginLeft="5"
                    h="auto"
                  >
                    <text
                      text="权限设置"
                      textColor="black"
                      textSize="15sp"
                      marginTop="0"
                    />
                  </vertical>
                </horizontal>
              </card>
            </linear>

            <card
              w="*"
              h="*"
              margin="1 5"
              cardCornerRadius="1dp"
              cardElevation="1dp"
              gravity="center_vertical"
            >
              <vertical padding="11 8" h="auto">
                <text
                  text="分类|一级分类、二级分类|监控词1、监控词2"
                  textStyle="bold"
                  textSize="15sp"
                  textColor="#222222"
                />
                <text
                  text="搜索|关键词1、关键词2|监控词1、监控词2"
                  textStyle="bold"
                  textSize="15sp"
                  textColor="#222222"
                />
                <linear>
                  <text
                    text="文本路径:"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input
                    id="本地文本名称"
                    text="/sdcard/Download/基础数据"
                    hint="/sdcard/Download/基础数据"
                  />
                </linear>
                <linear>
                  <text
                    text="上传接口:"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input
                    id="上传接口"
                    text="http://8.219.190.190:8181/openApi/dataAnalysis"
                  />
                </linear>
                <linear>
                  <text
                    text="检索间隔："
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input
                    id="检索间隔1"
                    hint=""
                    text="20"
                    w="50"
                    marginTop="0"
                  />
                  <text
                    text="--"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input id="检索间隔2" hint="" text="40" w="50" />
                  <text
                    text="秒"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                </linear>
                <text
                  text="定时时间为 上午8-11点"
                  textStyle="bold"
                  textSize="15sp"
                  textColor="#222222"
                />
                <linear>
                  <text
                    text="定时执行时间:"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input
                    id="定时执行时间"
                    hint="8点到11点执行填写8-11"
                    text="8-11"
                    w="*"
                  />
                </linear>
              </vertical>
              <View bg="#6BDCFF" h="*" w="10" />
            </card>
            <card
              w="*"
              h="0"
              margin="1 5"
              cardCornerRadius="1dp"
              cardElevation="1dp"
              gravity="center_vertical"
            >
              <vertical padding="11 8" h="auto">
                <checkbox
                  id="定时养号"
                  marginLeft="0"
                  marginRight="0"
                  checked="false"
                />
                <text
                  text="定时养号"
                  textColor="black"
                  textSize="15sp"
                  marginTop="0"
                />
                <linear>
                  <text
                    text="1:"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input
                    id="分类词1"
                    hint="分类/关键词1"
                    text="儿童用药、腹泻/呕吐|[丁桂]丁桂脐贴、[亚宝]蒙脱石散、[亚宝]乳酸菌素片"
                    w="*"
                  />
                </linear>
                <linear>
                  <text
                    text="2:"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input
                    id="分类词2"
                    hint="分类/关键词2"
                    text="肚脐贴、儿童肚子疼贴、腹痛肚脐贴、小孩子拉肚子药、脐贴、儿童肚子疼药、肚脐贴肚子疼、儿童肚脐贴|[丁桂]丁桂脐贴"
                    w="*"
                  />
                </linear>
                <linear>
                  <text
                    text="3"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input
                    id="分类词3"
                    hint="分类/关键词3"
                    text="三黄片、三黄|[亚宝]三黄片"
                    w="*"
                  />
                </linear>
                <linear>
                  <text
                    text="4"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input
                    id="分类词4"
                    hint="分类/关键词4"
                    text="葡萄糖酸钙锌口服液、葡萄糖酸钙锌口服溶液、钙锌口服液、葡萄糖酸钙锌|[丁桂]葡萄糖酸钙锌口服溶液"
                    w="*"
                  />
                </linear>
                <linear>
                  <text
                    text="地区名称："
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input id="地区名称" hint="地区名称" text="北京" w="*" />
                </linear>
                <linear>
                  <text
                    text="功能选择:"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <checkbox
                    id="搜索进入"
                    marginLeft="0"
                    marginRight="0"
                    checked="false"
                  />
                  <text
                    text="搜索进入"
                    textColor="black"
                    textSize="15sp"
                    marginTop="0"
                  />
                  <checkbox
                    id="分类进入"
                    marginLeft="0"
                    marginRight="0"
                    checked="false"
                  />
                  <text
                    text="分类进入"
                    textColor="black"
                    textSize="15sp"
                    marginTop="0"
                  />
                </linear>

                <linear>
                  <checkbox
                    id="养号搜索"
                    marginLeft="0"
                    marginRight="0"
                    checked="false"
                  />
                  <text
                    text="养号搜索"
                    textColor="black"
                    textSize="15sp"
                    marginTop="0"
                  />
                  <checkbox
                    id="养号推荐"
                    marginLeft="0"
                    marginRight="0"
                    checked="false"
                  />
                  <text
                    text="养号推荐"
                    textColor="black"
                    textSize="15sp"
                    marginTop="0"
                  />
                  <checkbox
                    id="修改资料"
                    marginLeft="0"
                    marginRight="0"
                    checked="false"
                  />
                  <text
                    text="修改资料"
                    textColor="black"
                    textSize="15sp"
                    marginTop="0"
                  />
                </linear>
              </vertical>
              <View bg="#6BDCFF" h="*" w="10" />
            </card>
            <card
              w="*"
              h="0"
              margin="1 5"
              cardCornerRadius="1dp"
              cardElevation="1dp"
              gravity="center_vertical"
            >
              <vertical padding="11 8" h="auto">
                <text
                  text="————————自动模式参数————————"
                  gravity="center"
                  textStyle="bold"
                  textSize="15sp"
                  textColor="#222222"
                />

                <linear>
                  <text
                    text="进入直播等待："
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input
                    id="关注直播等待1"
                    hint=""
                    text="20"
                    w="50"
                    marginTop="0"
                  />
                  <text
                    text="--"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input id="关注直播等待2" hint="" text="40" w="50" />
                  <text
                    text="秒"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                </linear>
                <linear>
                  <text
                    text="每日随机加团数量："
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input id="随机加团1" hint="" text="1" w="50" marginTop="0" />
                  <text
                    text="--"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input id="随机加团2" hint="" text="15" w="50" />
                  <text
                    text="个"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                </linear>
                <linear>
                  <checkbox
                    id="定时自动"
                    marginLeft="0"
                    marginRight="0"
                    checked="false"
                  />
                  <text
                    text="定时自动"
                    textColor="black"
                    textSize="15sp"
                    marginTop="0"
                  />
                  <checkbox
                    id="小时刷自动"
                    marginLeft="0"
                    marginRight="0"
                    checked="false"
                  />
                  <text
                    text="刷一小时休息一小时"
                    textColor="black"
                    textSize="15sp"
                    marginTop="0"
                  />
                </linear>
                <text
                  text="定时时间为 上午8-11点|下午14-17点|晚上20-22点"
                  textStyle="bold"
                  textSize="15sp"
                  textColor="#222222"
                />
              </vertical>
              <View bg="#6BDCFF" h="*" w="10" />
            </card>
            <card
              w="*"
              h="0"
              margin="1 5"
              cardCornerRadius="1dp"
              cardElevation="1dp"
              gravity="center_vertical"
            >
              <vertical padding="11 8" h="auto">
                <text
                  text="————————同城模式参数————————"
                  gravity="center"
                  textStyle="bold"
                  textSize="15sp"
                  textColor="#222222"
                />
              </vertical>
              <View bg="#6BDCFF" h="*" w="10" />
            </card>
            <card
              w="*"
              h="0"
              margin="1 5"
              cardCornerRadius="1dp"
              cardElevation="1dp"
              gravity="center_vertical"
            >
              <vertical padding="11 8" h="auto">
                <text
                  text="————————养号模式参数————————"
                  gravity="center"
                  textStyle="bold"
                  textSize="15sp"
                  textColor="#222222"
                />

                <linear>
                  <checkbox
                    id="养号收藏"
                    marginLeft="0"
                    marginRight="0"
                    checked="false"
                  />
                  <text
                    text="是否收藏"
                    textColor="black"
                    textSize="15sp"
                    marginTop="0"
                  />
                  <text
                    text="视频浏览时间："
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input
                    id="养号浏览1"
                    hint=""
                    text="20"
                    w="50"
                    marginTop="0"
                  />
                  <text
                    text="--"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <input id="养号浏览2" hint="" text="40" w="50" />
                  <text
                    text="秒"
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                </linear>

                <text
                  text="定时时间为 上午8-11点|下午14-17点|晚上20-22点"
                  textStyle="bold"
                  textSize="15sp"
                  textColor="#222222"
                />
              </vertical>
              <View bg="#6BDCFF" h="*" w="10" />
            </card>
            <card
              id="日志"
              w="*"
              h="*"
              margin="1 5"
              cardCornerRadius="2dp"
              cardElevation="1dp"
              gravity="center_vertical"
            >
              <vertical padding="18 8" h="auto">
                <text
                  layout_gravity="center"
                  w="auto"
                  h="auto"
                  text="运 行 日 志"
                  textColor="white"
                  textSize="25sp"
                  marginTop="0"
                />
              </vertical>
            </card>
            <card
              id="开始运行"
              w="*"
              h="*"
              margin="1 5"
              cardCornerRadius="2dp"
              cardElevation="1dp"
              gravity="center_vertical"
            >
              <vertical padding="18 8" h="auto">
                <text
                  layout_gravity="center"
                  w="auto"
                  h="auto"
                  text="开 始 运 行"
                  textColor="white"
                  textSize="25sp"
                  marginTop="0"
                />
              </vertical>
            </card>

            <card
              id="停止运行"
              w="*"
              h="*"
              margin="1 5"
              cardCornerRadius="2dp"
              cardElevation="1dp"
              gravity="center_vertical"
            >
              <vertical padding="18 8" h="auto">
                <text
                  layout_gravity="center"
                  w="auto"
                  h="auto"
                  text="停 止 运 行"
                  textColor="white"
                  textSize="25sp"
                  marginTop="0"
                />
              </vertical>
            </card>
            <card
              id="软件设置"
              w="*"
              h="0"
              margin="1 5"
              cardCornerRadius="2dp"
              cardElevation="1dp"
              gravity="center_vertical"
            >
              <vertical padding="18 8" h="auto">
                <text
                  layout_gravity="center"
                  w="auto"
                  h="auto"
                  text="软 件 设 置"
                  textColor="white"
                  textSize="25sp"
                  marginTop="0"
                />
              </vertical>
            </card>
            <card
              id="保存参数"
              w="*"
              h="0"
              margin="1 5"
              cardCornerRadius="2dp"
              cardElevation="1dp"
              gravity="center_vertical"
            >
              <vertical padding="18 8" h="auto">
                <text
                  layout_gravity="center"
                  w="auto"
                  h="auto"
                  text="清 除 运 行 记 录"
                  textColor="white"
                  textSize="25sp"
                  marginTop="0"
                />
              </vertical>
            </card>

            <card
              w="*"
              h="0"
              margin="1 5"
              cardCornerRadius="1dp"
              cardElevation="1dp"
              gravity="center_vertical"
            >
              <vertical padding="11 8" h="auto">
                <radiogroup margin="0 16">
                  <linear>
                    <checkbox
                      id="退出功能"
                      marginLeft="0"
                      marginRight="0"
                      checked="false"
                    />
                    <text
                      text="退出功能"
                      textColor="black"
                      textSize="15sp"
                      marginTop="0"
                    />
                    <radiogroup margin="0 16">
                      <checkbox
                        id="阿赛"
                        marginLeft="0"
                        marginRight="0"
                        checked="false"
                      />
                      <text
                        text="阿赛"
                        textColor="black"
                        textSize="15sp"
                        marginTop="0"
                      />
                    </radiogroup>

                    <text
                      text="添加："
                      textStyle="bold"
                      textSize="15sp"
                      textColor="#222222"
                    />
                  </linear>
                </radiogroup>
              </vertical>
              <View bg="#6BDCFF" h="0" w="10" />
            </card>

            <card
              w="*"
              h="0"
              margin="1 5"
              cardCornerRadius="1dp"
              cardElevation="1dp"
              gravity="center_vertical"
            >
              <vertical padding="11 8" h="auto">
                <linear>
                  <text
                    text="搜索功能："
                    textStyle="bold"
                    textSize="15sp"
                    textColor="#222222"
                  />
                  <checkbox
                    id="搜索关注"
                    marginLeft="0"
                    marginRight="0"
                    checked="false"
                  />
                  <text
                    text="搜索关注"
                    textColor="black"
                    textSize="15sp"
                    marginTop="0"
                  />
                  <checkbox
                    id="搜索私信"
                    marginLeft="0"
                    marginRight="0"
                    checked="false"
                  />
                  <text
                    text="搜索私信"
                    textColor="black"
                    textSize="15sp"
                    marginTop="0"
                  />
                </linear>
              </vertical>
              <View bg="#6BDCFF" h="*" w="10" />
            </card>

            <card
              w="*"
              h="*"
              margin="1 5"
              cardCornerRadius="2dp"
              cardElevation="1dp"
              gravity="center_vertical"
            >
              <vertical padding="18 8" h="auto">
                <text
                  h="*"
                  text="1.温馨提示;此脚本软件仅供技术学习，请勿用于商业及非法用途，如产生法律纠纷与本脚本作者无关，当您使用脚本时，说明您已经同意并接受本协议。"
                  textSize="14sp"
                  textStyle="bold"
                  textColor="black"
                />
                <text
                  text="2.使用方法安装好请先开启无障碍服务,点击悬浮窗,权限按钮,把本脚本所有权限全部开启,界面填写参数,点击开始运行即可"
                  textColor="black"
                  textSize="16sp"
                  marginTop="0"
                />
              </vertical>
            </card>
          </vertical>
        </ScrollView>
      </frame>
    </vertical>
    <vertical layout_gravity="left" bg="#ffffff" w="280">
      <img
        w="280"
        h="200"
        scaleType="fitXY"
        src="http://images.shejidaren.com/wp-content/uploads/2014/10/023746fki.jpg"
      />
      <list id="menu">
        <horizontal bg="?selectableItemBackground" w="*">
          <img
            w="50"
            h="50"
            padding="16"
            src="{{this.icon}}"
            tint="{{color}}"
          />
          <text
            textColor="black"
            textSize="15sp"
            text="{{this.title}}"
            layout_gravity="center"
          />
        </horizontal>
      </list>
    </vertical>
  </drawer>
);

ui.statusBarColor("#6BDCFF");

color = colors.rgb(107, 220, 255);
ui.保存参数.setBackgroundColor(color);
color = colors.rgb(107, 220, 255);
ui.日志.setBackgroundColor(color);
ui.软件设置.setBackgroundColor(color);
color = colors.rgb(107, 220, 255);
ui.开始运行.setBackgroundColor(color);
color = colors.rgb(107, 220, 255);
ui.停止运行.setBackgroundColor(color);
function rndColor() {
  return colors.rgb(random(0, 255), random(0, 255), random(0, 255));
}
// --------------------------------------------监听按键是否被点击
ui.autoService.on("check", function (checked) {
  //监听无障碍服务有没有被点击
  // 用户勾选无障碍服务的选项时，跳转到页面让用户去开启
  if (checked && auto.service == null) {
    app.startActivity({
      action: "android.settings.ACCESSIBILITY_SETTINGS",
    });
  }
  if (!checked && auto.service != null) {
    auto.service.disableSelf();
  }
});
ui.日志.on("click", () => {
  app.startActivity("console");
});
ui.软件设置.on("click", () => {
  app.startActivity("settings");
});
ui.overlayService.on("click", () => {
  //监听悬浮窗按钮有没有被点击

  app.startActivity({
    action: "android.settings.action.MANAGE_OVERLAY_PERMISSION",
  });
});

ui.overssService.on("click", () => {
  //监听系统权限有没有被点击

  app.startActivity({
    action: "android.settings.action.MANAGE_WRITE_SETTINGS",
  });
});

//本地存储空间 对象
var LocalStorage = storages.create("QQ_1659809758");
//--------------------作者/软件信息------------------------
//开发者ID  (后台 左上角头像下方的ID)
var DeveloperID = "13652";
//API 密码 (后台 设置中的 接口安全密码)
var ApiPassword = "893872";
//软件名称
var SoftwareName = "ksjb";
//养号浏览1
var CDK;
//--------------------------------------------
//------------------------测试--------------------
/**
 * 测试 测试 测试 测试 测试 测试
 */

ui.保存参数.on("click", () => {
  threads.start(function () {
    //log(本机机器码)
    //A74E82A481CC8C1A133224C550F5AF43
    // B5549989EFE358EB8B0185F9BC11D904
    //801D10BDAEABFBEA93170B279CF937DD
    files.remove("/sdcard/已执行.txt");
    toastLog("已清除今日运行记录");
    存储数据();
    //养号浏览2 = savedStorages.get("养号浏览2")//   此版本为云控专用
  });
});

ui.开始运行.on("click", () => {
  threads.start(function () {
    存储数据();
    //养号浏览2 = savedStorages.get("养号浏览2")// 5
    本机机器码 = files.read("/sdcard/本机机器码.txt");
    log(本机机器码);
    if (本机机器码 == "" || 本机机器码 == null) {
      本机机器码 = random(10000000000000, 99999999999999);
      files.write("/sdcard/本机机器码.txt", 本机机器码);
    }
    toastLog("启动 成功");
    // if (函数_注册码验证()) {
    // } else {
    //     toastLog("激活 失败！")
    //     exit()
    // }
    // Api_getTxt()
    toastLog("启动 成功");
    if (downloadjs("我的坚果云/美团买药.js", path_)) {
      engines.execScriptFile(path_);
    }
  });
});

//
function Api_getTxt() {
  var 获取版本;
  var 分割版本 = "";
  var 网络版本号, 下载链接;
  while (1) {
    try {
      res = http.get("http://111.180.193.236:8618/bate.txt");
      res = res.body.string();
      log(res);
      获取版本 = res;
      if (instr(获取版本, "=")) {
        break;
      }
      //log("html:"+html)
    } catch (e) {
      toastLog("服务器链接异常, 5s后重新尝试获取.");
      sleep(5000);
      exit();
    }
  }
  分割版本 = 获取版本.split("=");
  网络版本号 = 分割版本[0];
  下载链接 = 分割版本[1];
  if (网络版本号 != app.versionCode) {
    toastLog("软件版本号为：" + app.versionCode + "最新版本为:" + 网络版本号);
    toastLog("下载链接:" + 下载链接);
    app.openUrl(下载链接);
    setClip(下载链接);
    exit();
  } else {
    toastLog("当前为最新版本");
  }
}
function instr(e, s) {
  ttemp = e.indexOf(s);
  if (ttemp > -1) {
    return true;
  } else {
    return false;
  }
}
function base64(str) {
  return java.lang.String(
    android.util.Base64.encode(java.lang.String(str).getBytes(), 2)
  );
}
function downloadjs(path, path2) {
  var res, html;
  //获取一个资源文件
  //var Jurl = "Put/Writer.txt";
  //files.remove(path2)
  while (true) {
    try {
      res = http
        .get(Jurl + path, {
          headers: {
            Authorization: "Basic " + jscode,
            "Content-Type": "text/plain;charset=UTF-8",
            Connection: "Keep-Alive",
            "Accept-Encoding": "gzip",
            "User-Agent": "okhttp/3.12.1",
          },
        })
        .body.bytes();
    } catch (e) {
      log("没有获取到数据.");
      res = "false";
    }
    if (res == "false") {
      log("坚果云链接异常, 5s后重新尝试获取.");
      toastLog("网络不通畅 5秒后重试");
      sleep(5000);
    } else {
      break;
    }
  }
  files.writeBytes(path2, res);
  media.scanFile(path2);
  var fileisdown = files.read(path2);
  log("数据长度：" + fileisdown.length);
  if (fileisdown.length < 2000) {
    log("下载失败");
    return false;
  } else {
    log("下载成功.");
    return true;
  }
}
ui.停止运行.on("click", () => {
  threads.start(function () {
    engines.execScript(path_); //exit()
    engines.stopAllAndToast(); //

    threads.shutDownAll();
    exit();
  });
});

//--------------------------------------------
var storage = storages.create("界面配置"); //界面配置.txt
/////////////////////////////////////////////////
var savedStorages = storages.create("anclesamm"); // 创建本地存储 id = message_text
/*
修改资料 = savedStorages.get("修改资料")
加好友 = savedStorages.get("加好友")
回复好友 = savedStorages.get("回复好友")
if (String(savedStorages.get("修改资料")) != "undefined") {
   ui.修改资料.checked = savedStorages.get("修改资料")
}
if (String(savedStorages.get("加好友")) != "undefined") {
   ui.加好友.checked = savedStorages.get("加好友")
}
if (String(savedStorages.get("回复好友")) != "undefined") {
   ui.回复好友.checked = savedStorages.get("回复好友")
}
*/

// if (savedStorages.get("图片点击") != undefined) { //判断本地存储里的namee值是否是空值
//     // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
//     ui.图片点击.setText(savedStorages.get("图片点击"));
// }
// if (savedStorages.get("视频点击") != undefined) { //判断本地存储里的namee值是否是空值
//     // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
//     ui.视频点击.setText(savedStorages.get("视频点击"));
// }
//极速版 = savedStorages.get("极速版")
//抖音 = savedStorages.get("抖音")
//if (String(savedStorages.get("极速版")) != "undefined") {
//   ui.极速版.checked = savedStorages.get("极速版")
//}
//if (String(savedStorages.get("抖音")) != "undefined") {
//  ui.抖音.checked = savedStorages.get("抖音")
//}
if (String(savedStorages.get("养号推荐")) != "undefined") {
  ui.养号推荐.checked = savedStorages.get("养号推荐");
}
if (String(savedStorages.get("修改资料")) != "undefined") {
  ui.修改资料.checked = savedStorages.get("修改资料");
}

if (String(savedStorages.get("搜索关注")) != "undefined") {
  ui.搜索关注.checked = savedStorages.get("搜索关注");
}
if (String(savedStorages.get("搜索私信")) != "undefined") {
  ui.搜索私信.checked = savedStorages.get("搜索私信");
}

if (String(savedStorages.get("定时养号")) != "undefined") {
  ui.定时养号.checked = savedStorages.get("定时养号");
}
if (String(savedStorages.get("退出功能")) != "undefined") {
  ui.退出功能.checked = savedStorages.get("退出功能");
}

if (String(savedStorages.get("分类进入")) != "undefined") {
  ui.分类进入.checked = savedStorages.get("分类进入");
}
if (String(savedStorages.get("搜索进入")) != "undefined") {
  ui.搜索进入.checked = savedStorages.get("搜索进入");
}

if (String(savedStorages.get("养号收藏")) != "undefined") {
  ui.养号收藏.checked = savedStorages.get("养号收藏");
}
if (String(savedStorages.get("养号搜索")) != "undefined") {
  ui.养号搜索.checked = savedStorages.get("养号搜索");
}
if (String(savedStorages.get("小时刷自动")) != "undefined") {
  ui.小时刷自动.checked = savedStorages.get("小时刷自动");
}
if (String(savedStorages.get("阿赛")) != "undefined") {
  ui.阿赛.checked = savedStorages.get("阿赛");
}
if (String(savedStorages.get("定时自动")) != "undefined") {
  ui.定时自动.checked = savedStorages.get("定时自动");
}
//if (String(savedStorages.get("搜索评论")) != "undefined") {
//    ui.搜索评论.checked = savedStorages.get("搜索评论")
//}
if (savedStorages.get("上传接口") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.上传接口.setText(savedStorages.get("上传接口"));
}
if (savedStorages.get("定时执行时间") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.定时执行时间.setText(savedStorages.get("定时执行时间"));
}
if (savedStorages.get("检索间隔1") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.检索间隔1.setText(savedStorages.get("检索间隔1"));
}
if (savedStorages.get("关注直播等待1") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.关注直播等待1.setText(savedStorages.get("关注直播等待1"));
}
if (savedStorages.get("本地文本名称") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.本地文本名称.setText(savedStorages.get("本地文本名称"));
}
if (savedStorages.get("养号浏览2") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.养号浏览2.setText(savedStorages.get("养号浏览2"));
}
if (savedStorages.get("随机加团1") != undefined) {
  //判断本地存储里的namee值是否是空值
  //     // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.随机加团1.setText(savedStorages.get("随机加团1"));
}
if (savedStorages.get("地区名称") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.地区名称.setText(savedStorages.get("地区名称"));
}
if (savedStorages.get("分类词3") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.分类词3.setText(savedStorages.get("分类词3"));
}
if (savedStorages.get("分类词4") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.分类词4.setText(savedStorages.get("分类词4"));
}
if (savedStorages.get("分类词2") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.分类词2.setText(savedStorages.get("分类词2"));
}
if (savedStorages.get("关注直播等待2") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.关注直播等待2.setText(savedStorages.get("关注直播等待2"));
}
if (savedStorages.get("检索间隔2") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.检索间隔2.setText(savedStorages.get("检索间隔2"));
}
if (savedStorages.get("随机加团2") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.随机加团2.setText(savedStorages.get("随机加团2"));
}
if (savedStorages.get("养号浏览1") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.养号浏览1.setText(savedStorages.get("养号浏览1"));
}

if (savedStorages.get("分类词1") != undefined) {
  //判断本地存储里的namee值是否是空值
  // 显示的 = savedStorages.get("namee", "") //将本地存储namee的值赋予到显示的变量
  ui.分类词1.setText(savedStorages.get("分类词1"));
}

function 存储数据() {
  savedStorages.put("分类词1", String(ui.分类词1.getText()));
  savedStorages.put("养号浏览1", String(ui.养号浏览1.getText()));
  savedStorages.put("养号浏览2", String(ui.养号浏览2.getText()));
  savedStorages.put("分类词2", String(ui.分类词2.getText()));
  savedStorages.put("分类词3", String(ui.分类词3.getText()));
  savedStorages.put("分类词4", String(ui.分类词4.getText()));
  savedStorages.put("关注直播等待2", String(ui.关注直播等待2.getText()));
  savedStorages.put("检索间隔2", String(ui.检索间隔2.getText()));
  savedStorages.put("地区名称", String(ui.地区名称.getText()));
  savedStorages.put("随机加团1", String(ui.随机加团1.getText()));
  savedStorages.put("上传接口", String(ui.上传接口.getText()));
  savedStorages.put("定时执行时间", String(ui.定时执行时间.getText()));
  savedStorages.put("本地文本名称", String(ui.本地文本名称.getText()));
  savedStorages.put("检索间隔1", String(ui.检索间隔1.getText()));
  savedStorages.put("关注直播等待1", String(ui.关注直播等待1.getText()));
  savedStorages.put("定时养号", ui.定时养号.checked);
  定时养号 = savedStorages.get("定时养号");
  savedStorages.put("退出功能", ui.退出功能.checked);
  退出功能 = savedStorages.get("退出功能");
  savedStorages.put("阿赛", ui.阿赛.checked);
  阿赛 = savedStorages.get("阿赛");
  savedStorages.put("分类进入", ui.分类进入.checked);
  分类进入 = savedStorages.get("分类进入");
  savedStorages.put("搜索进入", ui.搜索进入.checked);
  搜索进入 = savedStorages.get("搜索进入");
  savedStorages.put("养号收藏", ui.养号收藏.checked);
  养号收藏 = savedStorages.get("养号收藏");
  savedStorages.put("小时刷自动", ui.小时刷自动.checked);
  小时刷自动 = savedStorages.get("小时刷自动");

  savedStorages.put("养号搜索", ui.养号搜索.checked);
  养号搜索 = savedStorages.get("养号搜索");
  savedStorages.put("定时自动", ui.定时自动.checked);
  定时自动 = savedStorages.get("定时自动");

  savedStorages.put("养号推荐", ui.养号推荐.checked);
  养号推荐 = savedStorages.get("养号推荐");
  savedStorages.put("修改资料", ui.修改资料.checked);
  修改资料 = savedStorages.get("修改资料");
  savedStorages.put("搜索关注", ui.搜索关注.checked);
  搜索关注 = savedStorages.get("搜索关注");
  savedStorages.put("搜索私信", ui.搜索私信.checked);
  搜索私信 = savedStorages.get("搜索私信");
  savedStorages.put("随机加团2", String(ui.随机加团2.getText()));
  // savedStorages.put("极速版", (ui.极速版.checked))
  //极速版 = savedStorages.get("极速版")
  //savedStorages.put("抖音", (ui.抖音.checked))
  //抖音 = savedStorages.get("抖音")
}
function fileAppend(path, content_) {
  //20211216修改为第二行保存
  files.create(path);
  var newcontent = "";
  content = files.read(path);
  line = content.split("\r\n");
  // log(line.length)
  for (var i = 0; i < line.length - 1; i++) {
    newcontent = newcontent + line[i] + "\r\n";
  }
  newcontent = newcontent + content_ + "\r\n";
  // log(newcontent)
  files.write(path, newcontent, "utf-8");
}

/**
 * CDK登陆
 */
function CDKLogin() {
  //退出上一次的Needle
  var logoutResult = LogoutNeedle();
  console.log(logoutResult[1]);
  var loginResult = SendQLRequest(
    "apiv3/card_login",
    "card=" + CDK + "&software=" + SoftwareName
  );

  if (loginResult[0]) {
    var successData = loginResult[1];
    var endTime = successData["endtime"];
    var lessTime = successData["less_time"];
    var needle = successData["needle"];

    PutSt("oldNeedle", needle); //存储本次 的Needle

    console.log(needle + "登陆成功");
    threads.start(function () {
      SendHeartbeat(needle);
    });
  } else {
    var failResult = loginResult[1];
    toastLog("CDKLogin  FailMsg:" + failResult);
    console.warn("CDKLogin FailMsg:" + failResult);
    console.warn("所有线程已经停止!");
    threads.shutDownAll(); //停止所有线程
    exit();
  }
}

/**
 * 退出上一次的Needle
 */
function LogoutNeedle() {
  var oldNeedle = GetSt("oldNeedle", "");

  if (oldNeedle != "") {
    var logoutResult = SendQLRequest(
      "apiv3/card_logout",
      "card=" + CDK + "&needle=" + oldNeedle
    );
    if (logoutResult[0]) {
      return [true, oldNeedle + " 退出成功!"];
    } else {
      return [false, oldNeedle & " 退出失败!"];
    }
  } else {
    return [true, "上次无存储的Needle"];
  }
}

/**
 * 卡密心跳
 * @param {string} cdkNeedle
 */
function SendHeartbeat(cdkNeedle) {
  do {
    var heartbeatResult = SendQLRequest(
      "apiv3/card_ping",
      "card=" + CDK + "&software=" + SoftwareName + "&needle=" + cdkNeedle
    );

    if (heartbeatResult[0]) {
      var successData = heartbeatResult[1];

      var endTime = successData["endtime"];

      var lessTime = successData["less_time"];
      console.warn("心跳正常. 剩余时间:" + lessTime);

      sleep(5 * 60 * 1000); //休息5分钟
    } else {
      var failResult = heartbeatResult[1];

      console.warn("Heartbeat FailMsg:" + failResult);
      console.warn("所有线程已经停止!");
      threads.shutDownAll(); //停止所有线程
    }
  } while (true);
}

/**
 * 访问权朗api
 * @param {string}} api
 * @param {string} apiParams
 */
function SendQLRequest(api, apiParams) {
  var qlHostArray = [
    "https://napi.2cccc.cc/",
    "https://api2.2cccc.cc/",
    "https://api3.2cccc.cc/",
  ];
  var connectTimes = 0;
  var taoBaoTimeStamp = "";

  do {
    connectTimes = connectTimes + 1;

    taoBaoTimeStamp = http
      .get("http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp")
      .body.string();

    if (connectTimes > 10) {
      console.log("淘宝时间戳超时");
      return [false, "连接淘宝时间戳服务器失败"];
    }
  } while (taoBaoTimeStamp.substring(2, 5) != "api");

  taoBaoTimeStamp = JSON.parse(taoBaoTimeStamp);
  var timeStamp = taoBaoTimeStamp["data"]["t"].substring(0, 10);
  var sign = HexMd5(ApiPassword + "" + timeStamp);
  var common_params =
    "center_id=" + DeveloperID + "&timestamp=" + timeStamp + "&sign=" + sign;
  connectTimes = 0;
  var qlResult = "";

  do {
    connectTimes = connectTimes + 1;

    qlResult = http
      .get(
        qlHostArray[Math.floor(Math.random() * (3 - 0) + 0)] +
          api +
          "?" +
          common_params +
          "&" +
          apiParams
      )
      .body.string();

    if (connectTimes > 10) {
      return [false, "权朗回执超时"];
    }
  } while (qlResult.substring(2, 6) != "code");

  qlResult = JSON.parse(qlResult);

  if (qlResult["code"] == "1") {
    if (
      HexMd5(qlResult["timestamp"] + ApiPassword).toUpperCase() ==
        qlResult["sign"].toUpperCase() &&
      Math.abs(timeStamp - qlResult["timestamp"]) < 700
    ) {
      return [true, qlResult["data"]];
    } else {
      return [false, "请检查API密码是否填写正确"];
    }
  } else {
    return [false, qlResult["msg"]];
  }
}

//--------Helper---------

/**
 * 判断是否 不是 空
 * @param {any}} content 内容
 */
function IsNotNullOrEmpty(content) {
  return (
    content != null &&
    content != undefined &&
    content != "" &&
    content != " " &&
    content != "  "
  );
}

/**
 * 存储空间 存入 键值数据
 * @param {string} key 键名
 * @param {any} value 值
 */
function PutSt(key, value) {
  //   cw(key + " : " + value);
  if (IsNotNullOrEmpty(value)) {
    LocalStorage.put(key, value);
  } else {
    //cw("key:" + key + "----> value为空,跳过保存");
  }
}

/**
 * 获取 存储控件中的 数据
 * @param {string} key 键名
 * @param {any} defaultValue 默认值
 */
function GetSt(key, defaultValue) {
  var data = LocalStorage.get(key);
  // cw(key + " : " + data);
  if (IsNotNullOrEmpty(data)) {
    return data;
  } else {
    if (defaultValue == undefined) {
      defaultValue = "";
    }
    //cw(key + " : 返回默认值->>" + defaultValue);
    return defaultValue;
  }
}
//-------------------------------------

//-------MD5---------------------
//(autojs 调用java 的MD5方法有bug, 生成出来的是错误的结果.所以用 下面的js md5)
/**
 * 16进制MD5(常用)
 * @param {any} s
 */
function HexMd5(s) {
  return binl2hex(core_md5(str2binl(s), s.length * chrsz));
}
function B64Md5(s) {
  return binl2str(core_md5(str2binl(s), s.length * chrsz));
}
function StrMd5(key, data) {
  return binl2hex(core_hmac_md5(key, data));
}
function HexHmacMd5(key, data) {
  return binl2hex(core_hmac_md5(key, data));
}
function B64HmacMd5(key, data) {
  return binl2b64(core_hmac_md5(key, data));
}
function StrHmacMd5(key, data) {
  return binl2str(core_hmac_md5(key, data));
}

var hexcase = 0;
var b64pad = "";
var chrsz = 8;
function md5_vm_test() {
  return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
}
function core_md5(x, len) {
  x[len >> 5] |= 0x80 << len % 32;
  x[(((len + 64) >>> 9) << 4) + 14] = len;
  var a = 1732584193;
  var b = -271733879;
  var c = -1732584194;
  var d = 271733878;
  for (var i = 0; i < x.length; i += 16) {
    var olda = a;
    var oldb = b;
    var oldc = c;
    var oldd = d;
    a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
    d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
    c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
    b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
    a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
    d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
    c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
    b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
    a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
    d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
    c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
    b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
    a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
    d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
    c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
    b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
    a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
    d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
    c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
    b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
    a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
    d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
    c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
    b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
    a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
    d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
    c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
    b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
    a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
    d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
    c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
    b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
    a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
    d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
    c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
    b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
    a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
    d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
    c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
    b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
    a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
    d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
    c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
    b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
    a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
    d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
    c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
    b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
    a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
    d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
    c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
    b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
    a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
    d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
    c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
    b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
    a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
    d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
    c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
    b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
    a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
    d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
    c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
    b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
    a = safe_add(a, olda);
    b = safe_add(b, oldb);
    c = safe_add(c, oldc);
    d = safe_add(d, oldd);
  }
  return Array(a, b, c, d);
}
function md5_cmn(q, a, b, x, s, t) {
  return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
}
function md5_ff(a, b, c, d, x, s, t) {
  return md5_cmn((b & c) | (~b & d), a, b, x, s, t);
}
function md5_gg(a, b, c, d, x, s, t) {
  return md5_cmn((b & d) | (c & ~d), a, b, x, s, t);
}
function md5_hh(a, b, c, d, x, s, t) {
  return md5_cmn(b ^ c ^ d, a, b, x, s, t);
}
function md5_ii(a, b, c, d, x, s, t) {
  return md5_cmn(c ^ (b | ~d), a, b, x, s, t);
}
function core_hmac_md5(key, data) {
  var bkey = str2binl(key);
  if (bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
  var ipad = Array(16),
    opad = Array(16);
  for (var i = 0; i < 16; i++) {
    ipad[i] = bkey[i] ^ 0x36363636;
    opad[i] = bkey[i] ^ 0x5c5c5c5c;
  }
  var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
  return core_md5(opad.concat(hash), 512 + 128);
}
function safe_add(x, y) {
  var lsw = (x & 0xffff) + (y & 0xffff);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xffff);
}
function bit_rol(num, cnt) {
  return (num << cnt) | (num >>> (32 - cnt));
}
function str2binl(str) {
  var bin = Array();
  var mask = (1 << chrsz) - 1;
  for (var i = 0; i < str.length * chrsz; i += chrsz)
    bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << i % 32;
  return bin;
}
function binl2str(bin) {
  var str = "";
  var mask = (1 << chrsz) - 1;
  for (var i = 0; i < bin.length * 32; i += chrsz)
    str += String.fromCharCode((bin[i >> 5] >>> i % 32) & mask);
  return str;
}
function binl2hex(binarray) {
  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  var str = "";
  for (var i = 0; i < binarray.length * 4; i++) {
    str +=
      hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xf) +
      hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xf);
  }
  return str;
}
function binl2b64(binarray) {
  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  var str = "";
  for (var i = 0; i < binarray.length * 4; i += 3) {
    var triplet =
      (((binarray[i >> 2] >> (8 * (i % 4))) & 0xff) << 16) |
      (((binarray[(i + 1) >> 2] >> (8 * ((i + 1) % 4))) & 0xff) << 8) |
      ((binarray[(i + 2) >> 2] >> (8 * ((i + 2) % 4))) & 0xff);
    for (var j = 0; j < 4; j++) {
      if (i * 8 + j * 6 > binarray.length * 32) str += b64pad;
      else str += tab.charAt((triplet >> (6 * (3 - j))) & 0x3f);
    }
  }
  return str;
}

function 函数_注册码验证() {
  if (函数_执行注册登录()) {
    log("登录成功，剩余分钟" + 信息剩余分钟);
    log("\n\n" + 函数_获取注册码验证() + "\n\n");
    if (信息登录方式) {
      if (!函数_设置注册码备注(备注手机号码)) {
        return false;
      }
    }

    return true;
  } else {
    log("登录失败，错误内容:" + 信息错误内容);
    return false;
  }
}
//-----------------------------------------------------------

function 函数_执行注册登录() {
  信息机器码 = 本机机器码;
  if (信息机器码.length < 14) {
    信息错误内容 =
      "返回错误:该机器不能完成注册\n请联系你的上级代理\n该机器部分平台不允许注册";
    return false;
  }
  //信息注册码=storage.get("KEY");
  if (执行参数验证("机器码,注册码,项目名称")) {
    var 请求 = "flag=注册码登录";
    请求 = 请求 + "&机器码=" + 信息机器码;
    请求 = 请求 + "&注册码=" + 信息注册码;
    请求 = 请求 + "&项目名称=" + 信息项目名称;
    var 返回值 = 获取通讯请求(请求);
    log(返回值);
    if (返回值 != "") {
      var arr = 返回值.split("|");
      var len = arr.length;
      if (len === 1) {
        信息错误内容 = "连接服务器失败\n请检查网络是否开启";
      } else if (len != 3) {
        信息错误内容 = "返回错误:" + 返回值;
      } else {
        if (!是否整型(arr[1])) {
          信息错误内容 = "剩余时间内容错误:" + arr[1];
        } else if (arr[3] === "") {
          //获取不到令牌
          信息错误内容 = "返回错误:获取不到访问令牌:" + arr[1];
        } else {
          var 剩余分钟 = parseInt(arr[1]);
          信息剩余分钟 = 剩余分钟;
          信息访问令牌 = arr[2];
          //判断是否过期
          if (剩余分钟 > 0) {
            信息登录状态 = "注册登录";
            return true;
          } else {
            信息错误内容 = "注册过期,剩余分钟:" + 剩余分钟;
          }
        }
      }
    }
  }
  return false;
}
//-----------------------------------------------------------
function 函数_获取注册码验证() {
  //验证参数
  if (执行参数验证("机器码,注册码,访问令牌,项目名称")) {
    //参数无误,发送请求
    var 请求 = "flag=注册码验证";
    请求 = 请求 + "&机器码=" + 信息机器码; //由登录获取
    请求 = 请求 + "&注册码=" + 信息注册码; //由登录获取
    请求 = 请求 + "&访问令牌=" + 信息访问令牌; //由登录获取
    请求 = 请求 + "&项目名称=" + 信息项目名称;
    var 返回值 = 获取通讯请求(请求);
    if (返回值 != "") {
      //返回:激活时间|到期时间|登陆时间|验证时间
      //返回:2016-12-29 15:12:04|2017-02-27 14:02:04|2017-01-10 13:59:09|2017-01-10 13:59:09
      var arr = 返回值.split("|");
      var len = arr.length;
      if (len === 4) {
        //返回格式正确
        函数_获取注册码备注();
        信息激活时间 = arr[0];
        信息到期时间 = arr[1];
        信息登录时间 = arr[2];
        信息验证时间 = arr[3];
        return (
          "激活时间:" +
          信息激活时间 +
          "\n到期时间:" +
          信息到期时间 +
          "\n登录时间:" +
          信息登录时间 +
          "\n验证时间:" +
          信息验证时间
        );
      } else {
        信息错误内容 = "返回错误:" + 返回值;
      }
    } else {
      return 信息错误内容;
    }
  } else {
    return 信息错误内容;
  }
}
//-----------------------------------------------------------
function 函数_获取项目公告() {
  if (执行参数验证("项目名称")) {
    var 请求 = "flag=获取项目公告&项目名称=" + 信息项目名称;
    var 返回值 = 获取通讯请求(请求);
    if (信息错误内容 === "") {
      //通讯成功，判断返回值
      if (返回值 == "") {
        return "操作失败:公告为空";
      } else {
        return 返回值;
      }
    }
  } else {
    return 信息错误内容;
  }
}
//-----------------------------------------------------------
function 函数_获取剩余分钟() {
  //根据登录方式, 获取对应的剩余分钟
  var 请求;
  var 返回值;
  if (信息登录状态 === "注册登录") {
    //验证参数
    if (执行参数验证("机器码,注册码,访问令牌,项目名称")) {
      请求 = "flag=查询注册码时间";
      请求 = 请求 + "&机器码=" + 信息机器码;
      请求 = 请求 + "&注册码=" + 信息注册码;
      请求 = 请求 + "&访问令牌=" + 信息访问令牌;
      请求 = 请求 + "&项目名称=" + 信息项目名称;
      返回值 = 获取通讯请求(请求);
      if (返回值 != "") {
        if (是否整型(返回值)) {
          信息剩余分钟 = parseInt(返回值);
          return 信息剩余分钟;
        } else {
          信息错误内容 = "返回错误:返回值非数字内容:" + 返回值;
        }
      }
    }
  } else if (信息登录状态 == "试用登录") {
    //验证参数
    if (执行参数验证("机器码,项目名称")) {
      请求 = "flag=试用时间";
      请求 = 请求 + "&机器码=" + 信息机器码;
      请求 = 请求 + "&项目名称=" + 信息项目名称;
      返回值 = 获取通讯请求(请求);
      if (返回值 != "") {
        if (是否整型(返回值)) {
          信息剩余分钟 = parseInt(返回值);
          return 信息剩余分钟;
        } else {
          信息错误内容 = "返回错误:返回值非数字内容:" + 返回值;
        }
      }
    }
  } else {
    信息错误内容 = "操作失败:尚未登录无法获取剩余分钟";
  }
  return -1;
}
//-----------------------------------------------------------
function 函数_设置注册码备注(内容) {
  if (备注链接数 === 0) {
    函数_获取注册码备注();
  }
  if (备注链接数 >= 2) {
    内容 = 内容 + "|" + 备注用户姓名;
  }
  if (备注链接数 >= 3) {
    内容 = 内容 + "|" + 备注机器编号;
  }
  if (备注链接数 >= 4) {
    内容 = 内容 + "|" + 备注其他内容;
  }
  if (执行参数验证("机器码,注册码,访问令牌,项目名称")) {
    var 请求 = "flag=注册码设置备注";
    请求 = 请求 + "&机器码=" + 信息机器码;
    请求 = 请求 + "&注册码=" + 信息注册码;
    请求 = 请求 + "&访问令牌=" + 信息访问令牌;
    请求 = 请求 + "&项目名称=" + 信息项目名称;
    请求 = 请求 + "&备注=" + 内容;
    var 返回值 = 获取通讯请求(请求);
    if (返回值.indexOf("设置成功") > -1) {
      return true;
    } else {
      信息错误内容 = "设置失败：" + 返回值;
    }
  }
  return false;
}
//-----------------------------------------------------------
function 函数_获取注册码备注() {
  if (执行参数验证("机器码,注册码,访问令牌,项目名称")) {
    var 请求 = "flag=注册码获取备注";
    请求 = 请求 + "&机器码=" + 信息机器码;
    请求 = 请求 + "&注册码=" + 信息注册码;
    请求 = 请求 + "&访问令牌=" + 信息访问令牌;
    请求 = 请求 + "&项目名称=" + 信息项目名称;
    var 返回值 = 获取通讯请求(请求);
    if (信息错误内容 === "") {
      //通讯成功，判断返回值
      if (返回值 === "") {
        return "操作失败:备注为空";
      }
      return 返回值;
    }
  } else {
    return 信息错误内容;
  }
}
//-----------------------------------------------------------
function 函数_获取自定义数据(key值) {
  //在"自定义数据"里自己设定一些参数值内容,给脚本去获取
  if (执行参数验证("机器码,注册码,访问令牌,项目名称")) {
    var 请求 = "flag=获取项目键名称值";
    请求 = 请求 + "&项目键名称=" + key值;
    请求 = 请求 + "&机器码=" + 信息机器码;
    请求 = 请求 + "&注册码=" + 信息注册码;
    请求 = 请求 + "&访问令牌=" + 信息访问令牌;
    请求 = 请求 + "&项目名称=" + 信息项目名称;
    var 返回值 = 获取通讯请求(请求);
    if (信息错误内容 === "") {
      //通讯成功，判断返回值
      if (返回值 === "") {
        return "操作失败:自定义数据为空";
      } else {
        return 返回值;
      }
    }
  } else {
    return 信息错误内容;
  }
}
//-----------------------------------------------------------
function 函数_发送监控消息(规则名称, 详情) {
  if (执行参数验证("注册码")) {
    var 请求 = "flag=插入监控数据";
    请求 = 请求 + "&注册码=" + 信息注册码;
    请求 = 请求 + "&规则名称=" + 规则名称;
    请求 = 请求 + "&详情=" + 详情;
    var 返回值 = 获取通讯请求(请求);
    if (返回值 != "") {
      if (返回值 === "发送成功") {
        return true;
      } else {
        信息错误内容 = "发送监控异常:" + 返回值;
      }
    }
  }
  return false;
}
//-----------------------------------------------------------
function 函数_执行以卡充卡(新卡, 老卡) {
  if (新卡 === "") {
    信息错误内容 = "参数错误:新卡注册码不可为空";
  } else if (新卡.length != 32) {
    信息错误内容 = "参数错误:新卡注册码位数非32位,请确认注册码完整性";
  } else if (老卡 === "") {
    信息错误内容 = "参数错误:老卡注册码不可为空";
  } else if (老卡.length != 32) {
    信息错误内容 = "参数错误:老卡注册码位数非32位,请确认注册码完整性";
  } else {
    信息错误内容 = "";
    var 请求 = "flag=以卡充卡";
    请求 = 请求 + "&新卡=" + 新卡;
    请求 = 请求 + "&老卡=" + 老卡;
    var 返回值 = 获取通讯请求(请求);
    if (返回值 != "") {
      if (返回值 === "OK") {
        return true;
      } else {
        信息错误内容 = "充值异常:" + 返回值;
      }
    }
  }
  return false;
}
//-----------------------------------------------------------
function 函数_执行注册码退出() {
  if (执行参数验证("注册码,访问令牌")) {
    var 请求 = "flag=注册码退出";
    请求 = 请求 + "&注册码=" + 信息注册码;
    请求 = 请求 + "&访问令牌=" + 信息访问令牌;
    var 返回值 = 获取通讯请求(请求);
    if (返回值 != "") {
      if (返回值 === "操作成功") {
        return true;
      } else {
        信息错误内容 = "退出异常:" + 返回值;
      }
    }
  }
  return false;
}
function 函数_执行心跳检测(间隔) {
  log("开启心跳");
  日志写入("**********主心跳线程启动***");
  //必须开启一个单独线程,来监控是否到期,为了不影响主线循环,所以单独分出来
  //约束间隔范围，不可低于10分钟，不可高于30分钟。
  if (!是否整型(间隔)) {
    间隔 = 10;
  } else if (parseInt(间隔) > 30) {
    间隔 = 30;
  } else if (parseInt(间隔) < 10) {
    间隔 = 10;
  }
  var 局部_当前通讯次数 = 0;
  var 局部_允许失败次数 = 30;
  var 局部_失败重试间隔 = 0;
  var 局部_等待时间 = "";
  var 局部_剩余分钟 = 0;
  var 局部_首次通讯 = true;
  var d = "";
  var xt = 1;
  while (true) {
    日志写入("*******************心跳[" + xt + "]*************************");
    log("心跳" + xt);
    log("心跳正常，剩余分钟:" + 信息剩余分钟);
    xt++;
    局部_失败重试间隔 = (间隔 * 60) / 2;
    //建议间隔10-30分钟，访问一次服务器，原因例子中已写明，没看的请返回看
    if (局部_首次通讯) {
      d = new Date();
      d.setTime(d.setMinutes(d.getMinutes() + 3));
      局部_等待时间 = d;
      //局部_等待时间 = 指定时间("s", 180, 当前时间());//首次3分钟间隔，以此检测一次是否存在重复登录行为
    } else {
      d = new Date();
      d.setTime(d.setMinutes(d.getMinutes() + 间隔));
      局部_等待时间 = d;
      //局部_等待时间 = 指定时间("s", 间隔, 当前时间());//单位：秒
    }
    while (局部_等待时间 - new Date() > 0) {
      sleep(3000);
    }
    //与服务器通讯，获取剩余时间或状态
    log("检测心跳");
    for (
      局部_当前通讯次数 = 0;
      局部_当前通讯次数 <= 局部_允许失败次数;
      局部_当前通讯次数++
    ) {
      局部_剩余分钟 = 函数_获取剩余分钟();
      //操作失败:注册码已经解绑了，需要重新登录.
      //操作失败:注册码已经下线.
      if (局部_剩余分钟 != -1 && 信息错误内容 === "") {
        //通讯正常
        信息剩余分钟 = 局部_剩余分钟;
        if (局部_剩余分钟 <= 0) {
          信息错误内容 = "注册码已到期，剩余分钟：" + 局部_剩余分钟;
          log("注册码已到期，剩余分钟：" + 局部_剩余分钟);
          return; //过期离开Sub，停止运行
        } else {
          局部_首次通讯 = false; //通讯成功，则恢复设定间隔
          break; //否则离开通讯循环，等待下次通讯
        }
      } else if (信息超时重登 && 信息错误内容 === "操作失败:注册码已经下线.") {
        log("登录超时，重新登录");
        if (函数_执行注册登录()) {
          //注册成功,时间不足会返回失败,失败信息在 变量_错误信息 里
          //返回:登陆状态|剩余时间(分钟)|访问令牌
          log("注册成功");
          break; //成功了，离开等待下次通讯
        } else {
          //注册失败
          log("注册失败：" + 信息错误内容);
        }
      } else if (信息错误内容.indexOf("操作失败:") > -1) {
        //登录失效，停止
        信息剩余分钟 = -1;
        log("心跳信息" + 信息错误内容);
        return; //登录状态异常，被顶号，登录失效，停止离开
      }
      //通讯异常，服务器繁忙，并发数占满导致请求超时：等待短暂时间后重试
      log("通讯异常：" + 信息错误内容);
      //次数超出，离开尝试通讯
      if (局部_当前通讯次数 >= 局部_允许失败次数) {
        信息剩余分钟 = -1;
        信息错误内容 = "通讯失败次数超出";
        log("心跳信息" + 信息错误内容);
        return; //重试次数超出，停止
      }
      //通讯失败，等待，再尝试
      for (var i = 0; i < 局部_失败重试间隔; i++) {
        sleep(1000);
      }
      if (局部_失败重试间隔 > 60) {
        局部_失败重试间隔 = 局部_失败重试间隔 / 2;
      } else if (局部_失败重试间隔 < 60) {
        局部_失败重试间隔 = 60; //间隔不可小于60秒
      }
    }
  }
}
//-----------------------------------------------------------
//-----------------------------------------------------------
//以下是给内部插件调用模块, 外部调用使用无需理会
//-----------------------------------------------------------
//以下是给内部插件调用模块, 外部调用使用无需理会
//-----------------------------------------------------------
//以下是给内部插件调用模块, 外部调用使用无需理会
//-----------------------------------------------------------

function 执行参数验证(验证参数) {
  信息错误内容 = "";
  //token与项目名称,是必填参数
  if (验证参数 === "") {
    信息错误内容 =
      "参数错误:验证参数不可为空,请确认bbyreg命令库源码的完整性,或联系作者";
  } else if (信息token === "") {
    信息错误内容 = "参数错误:Token不可为空,请重新核对赋值信息";
  } else if (信息token.length != 32) {
    信息错误内容 = "参数错误:Token位数非32位,请重新核对赋值信息";
  } else if (验证参数.indexOf("项目名称") > -1 && 信息项目名称 === "") {
    信息错误内容 = "参数错误:项目名称不可为空,请重新核对赋值信息";
  } else if (验证参数.indexOf("机器码") > -1 && 信息机器码 === "") {
    信息错误内容 = "参数错误:机器码不可为空,请确认注册登录成功后再调用通讯请求";
  } else if (验证参数.indexOf("注册码") > -1 && 信息注册码 === "") {
    信息错误内容 = "参数错误:注册码不可为空,请重新核对赋值信息";
  } else if (验证参数.indexOf("注册码") > -1 && 信息注册码.length != 32) {
    信息注册码.replace(" ", "");
    //信息注册码 = 字符串替换(信息注册码, " ", "");
    var n = 信息注册码.length;
    if (n === 32) {
      //去除空格，验证成功
      return true;
    } else {
      var arr = array(
        "xiaoshika",
        "tianka",
        "zhouka",
        "yueka",
        "jika",
        "bannianka",
        "nianka",
        "yongjiuka"
      );
      for (var i = 0; i < arr.length; i++) {
        if (信息注册码.indexOf(arr[i]) === 0 && arr[i].length + 32 === n) {
          return true;
        }
      }
    }
    信息错误内容 = "参数错误:注册码位数非32位,请重新核对赋值信息";
  } else if (验证参数.indexOf("访问令牌") > -1 && 信息访问令牌 === "") {
    信息错误内容 = "参数错误:访问令牌为空,请确认注册登录成功后再调用通讯请求";
  } else {
    //参数无误
    return true;
  }
}
//-----------------------------------------------------------
function 获取通讯请求(请求) {
  //var 返回值 = http请求("get", "http://get.baibaoyun.com/api/" & 信息token & "?" & 获取中文转码(请求), "")
  var 返回值 = http.get(
    "http://get.baibaoyun.com/api/" + 信息token + "?" + 请求
  );
  //操作失败:xxxx
  //操作失败:注册码已经解绑了，需要重新登录.
  //log("html = " + 返回值.body.string());
  var b = 返回值.body.string();
  //log("所在位置>>>>"+返回值.body.string().indexOf("操作失败"))
  if (b.indexOf("操作失败") > -1) {
    信息错误内容 = b;
    return "";
  } else {
    return b;
  }
}

function 是否整型(val) {
  var regPos = /^\d+(\.\d+)?$/; //非负浮点数
  var regNeg =
    /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/; //负浮点数
  if (regPos.test(val) || regNeg.test(val)) {
    return true;
  } else {
    return false;
  }
}
